Xin chào mừng bạn đã ghé thăm blog của Nguyễn Văn Tiến!.Chúc bạn sức khỏe, niềm vui và an lành!.
Hiển thị các bài đăng có nhãn Công nghệ Java. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Công nghệ Java. Hiển thị tất cả bài đăng

Thứ Năm, 22 tháng 9, 2016

[Spring Framework] - Giới thiệu về Spring Framework

Nội dung bài viết:
  1. Ciới thiệu về Spring Framework.
  2. Thành phẩn của Spring Framework
  3. Lý do sử dụng
  4. Sơ đồ luồng đi của chương trình
  5. Download demo
  6. Tài liệu tham khảo.

1. GIỚI THIỆU VỀ SPRING FRAMEWORK

Spring Framework(gọi tắt Spring), là một framework mã nguồn mở được viết bằng Java. Nó được xem như là một giải pháp kiến trúc tốt nhất của Java EE hiện nay.
Nó được sử dụng phổ biến nhất trong các Framework của Java, với cộng đồng sử dụng đông đảo, tài liệu trainning và support rất nhiều.
Tại Việt Nam, Spring là Framework Java được ưa thích sử dụng và rất phổ biến.

Biểu đồ độ phổ biến của các Framework trong Java.

2. THÀNH PHẦN CỦA SPRING FRAMEWORK


2.1. Core Container.

Core package là phần cơ bản nhất của framework, cung cấp những đặc tính IoC (Inversion of Control: Khung chứa đảo ngược khống chế) và Dependency Injection.

Khái niệm cơ bản là BeanFactory - cài đặt factory pattern cho phép bạn móc nối sự phụ thuộc giữa các đối tượng trong file cấu hình.

2.2. Spring Context/Application Context.

Phía trên của Core package là Context package - cung cấp cách để truy cập đối tượng.

Context package kết thừa các đặc tính từ bean package và thêm vào chức năng đa ngôn ngữ (I18N), truyền sự kiện, resource-loading,...

2.3. Spring AOP (Aspect Oriented Programming).

Spring AOP module tích hợp chức năng lập trình hướng khía cạnh vào Spring framework thông qua cấu Hình của nó. Spring AOP module cung cấp các dịch vụ quản lý giao dịch cho các đối tượng trong bất kỳ ứng dụng nào sử dụng Spring. Với Spring AOP chúng ta có thể tích hợp declarative transaction management vào trong ứng dụng mà không cần dựa vào EJB component.

Spring AOP module cũng đưa lập trình metadata vào trong Spring. Sử dụng cái này chúng ta có thể thêm annotation (chú thích) vào source code để hướng dẫn Spring và làm thế nào để liên hệ với aspect (Khía cạnh khác).

2.4. Spring DAO.

DAO package cung cấp cho tầng JDBC, bỏ bớt những coding dài dòng của JDBC và chuyển đổi mã lỗi được xác định bởi database vendor. JDBC package cung cấp cách lập trình tốt như declarative transaction management.

Tầng JDBC và DAO đưa ra một cây phân cấp exception để quản lý kết nối đến database, điều khiển exception và thông báo lỗi được ném bởi vendor của database. Tầng exception đơn giản điều khiển lỗi và giảm khối lượng code mà chúng ta cần viết như mở và đóng kết nối. Module này cũng cung cấp các dịch vụ quản lý giao dịch cho các đối tượng trong ứng dụng Spring.

2.5. Spring ORM.

ORM package cung cấp tầng tích hợp với object-
relational mapping API bao gồm: JDO, Hibernate, iBatis.

Sử dụng ORM package bạn có thể sử dụng tất cả các object-relational mapping đó kết hợp với tất cả các đặc tính của Spring như declarative transaction management.

2.6. Spring Web module.

Spring Web package cung cấp đặc tính của web như: chức năng file-upload, khởi tạo IoC container sử dụng trình lắng nghe serlvet và web-oriented application context.

Nằm trên application context module, cung cấp context cho các ứng dụng web. Spring cũng hỗ trợ tích hợp với Struts, JSF và Webwork. Web module cũng làm giảm bớt các công việc điều khiển nhiều request và gắn các tham số của request vào các đối tượng domain.

2.7. Spring MVC Framework.

Spring Framework là một ứng dụng mã nguồn mở phổ biến cho Java EE phát triển dễ dàng hơn. Nó bao gồm một container, một framework cho các thành phần quản lý, và một bộ các snap-in dịch vụ cho các giao diện người dùng web, giao dịch,.... Một phần của

Spring Framework là Spring Web MVC, một mô hình MVC mở rộng để tạo các ứng dụng web.

MVC Framework thì cài đặt đầy đủ đặc tính của MVC pattern để xây dựng các ứng dụng Web. MVC framework thì cấu hình thông qua giao diện và chứa được một số kỹ thuật view bao gồm: JSP, Velocity, Tiles và generation of PDF và Excel file. Spring MVC framework cung cấp sự phân biệt rõ ràng giữa domain model và web form.

3. LÝ DO SỬ DỤNG
  • Tất cả các framework đã được tích hợp rất tốt vào Spring.
  • Hoạt động rất tốt khi áp dụng theo kiến trúc MVC.
  • Sử dụng cơ chế plug-in.
  • Kết hợp rất tốt với các O/R (object-relational) Mapping frameworks như là Hibernate.
  • Dễ Testing ứng dụng.
  • Ít phức tạp hơn so với các framework khác.
  • Cộng đồng người sử dụng rất nhiều, nhiều sách mới được xuất bản.
4. SƠ ĐỒ LUỒNG ĐI CỦA CHƯƠNG TRÌNH

Sơ đồ request - reponse:





DispatcherServlet của Spring MVC sẽ đọc file xml cấu hình theo nguyên tắc mà SpringMVC đề ra:




  • {servlet-name} ==> /WEB-INF/{servlet-name}-servlet.xml

Trong trường hợp bạn không muốn sử dụng nguyên tắc đó bạn có thể cấu hình DispatcherServlet của SpringMVC theo cách sau (Trong file web.xml):

1
2
3
4
5
6
7
8
9
10
<servlet>
  <servlet-name>my-dispatcher-name</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
  <init-param>
      <!-- override default name {servlet-name}-servlet.xml -->
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/springmvc-myconfig.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
Luồng đi chính của ứng dụng MVC:

5. DOWNLOAD DEMO

Link tải demo và tài liệu tham khảo:

https://drive.google.com/drive/u/0/folders/0B8PjuGQA6-MdbnFaTGNDdnZON2s

Công nghệ sử dụng trong ví dụ demo:

  • Spring MVC 4
  • Maven project
  • Database Postgres SQL 9.2

6. TÀI LIỆU THAM KHẢO

Bài viết có tham khảo tài liệu và sử dụng hình ảnh của các trang dưới dây:

Thứ Ba, 9 tháng 8, 2016

Top 10 Web Frameworks trong java

Bài viết này phân tích các top 10 web framework bằng ngôn ngữ Java trong năm 2015. Những phân tích này sẽ giúp các bạn định hướng lựa chọn để nghiên cứu hay sử dụng cho dự án các năm sau. 
Dữ liệu phân tích dựa theo các nguồn thông tin đáng tin cậy sau:
  • Công việc mới trên thị trường trên các website tuyển dụng nổi tiếng, như: indeed.com
  • Các thảo luận trong năm trên các website hỏi đáp nổi tiếng, như: stackoverflow.com
  • Các phản hồi của cộng đồng trên các mạng xã hội phổ biến như, reddit.com

Đầu tiên, giới thệu top 10 framework, sau đó liệt kê ra top 5 framework dẫn đầu. Dưới đây là các framework phổ biến:
  • Spring MVC/Spring Boot
  • Grails
  • Dropwizard
  • Vert.x
  • Play
  • Spark
  • Vaadin
  • Ninja
  • Jodd
  • jHipster
Lý do đưa ra 10 framework trên là áp dụng hai phương pháp thống kê sau:

Phân tích các tuyển dụng mới liên quan: nhu cầu sử dụng các framework nào, số lượng nhân sự cần trong các tuyển dụng của các công ty trên website indeed.com
Phân tích các thảo luận trong năm trên internet: số lượng, tần xuất các hỏi đáp, thảo luận về các framework trên website stackoverflow.com

Phân tích dữ liệu - Java Web Framework theo các tuyển dụng mới trên thị trường

Thực hiện thống kê các tuyển dụng mới trong năm cho đến hiện tại trên hệ thống indeed.com liên quan đến các framework trên thấy framework được dùng phổ biến sau:
  • Spring MVC
  • Grails
  • Play
  • Vaadin
  • Dropwizard
  • Spring Boot
  • Vert.x
Các framework còn lại là spark, jodd, ninja, jHipster không xuất hiện hoặc xuất hiện ít.


Biểu đồ Java web framework với tuyển dụng mới

Như trên biểu đồ, Spring MVC đang dẫn đầu, đứng tiếp theo là các framework Grails và Play. 

Phân tích Java Web Frameworks theo các thảo luận trên internet

Thống kê số lượng thảo luận trên stackoverflow.com cho đến thời điểm hiện tại và khả năng áp dụng trên cộng đồng người phát triển phần mềm. Các framework được sử dụng phổ biến theo thứ tự giảm dần sau:
  • Spring MVC
  • Grails
  • Play
  • Spring Boot
  • Vaadin
  • Dropwizard
  • Vert.x
Dưới đây là biểu đồ tần xuất được nhắc đến và sử dụng trong các thảo luận.


Biểu đồ Java web framework với các thảo luận

Như hình trên, Spring MVC vẫn tiếp tục dẫn đầu, sau đó là Grails và Play.

Top 5 Java Web Frameworks

Dựa trên các phân tích trên, chúng ta thấy 5 framework được dùng phổ biến sau:
  • Spring MVC
  • Grails
  • Play
  • Spring Boot
  • Vaadin
Chúng ta hãy cùng đánh giá và tìm hiểu các đặc điểm cơ bản của 5 framework trên từ đó xem xét framework nào phù hợp với nhu cầu sử dụng:

Spring MVC

Spring MVC dẫn đầu bảng xếp hạng. Tên đầy đủ của framework này là Spring Web MVC framework, là framework xây dựng theo mô hình "model view controller - MVC". Spring MVC sử dụng DispatcherServlet để tiếp nhận và chuyển các yêu cầu tới các dịch vụ xử lý(handler) và các kỹ thuật liên quan(configurable handler mappings, view resolution, locale, time zone and theme resolution, upload file) 

Grails

Xếp sau Spring MVC là Grails. Grails là framework mã nguồn mở. Framework này có những ưu điểm của ngôn ngữ lập trình Groovy và trải nghiệm phát triển stream-lined

Play

Play thường được dùng cùng với Scala hơn là Java. Sử dụng Play framework có thể xây dựng ứng dụng web dễ dàng với Java và Scala. 

Spring Boot

Spring Boot giúp xây dựng ứng dụng stand-alone dễ dàng. Cũng theo ý tưởng của web framework, Spring Boot cũng hỗ trợ cách cấu hình các dịch vụ dùng XML. 

Vaadin

Vaadin là Java framework, được dùng để phát triển các ứng web giao diện look and feel và hiệu suất cao. Sử dụng Google Web Toolkit, Vaadin giúp xây dựng ứng dụng phía server và UI dùng Java.

Thứ Năm, 2 tháng 6, 2016

[Java] Sự khác nhau giữa String và StringBuffer - StringBuilder

Bạn học Java lâu chưa? Bạn đã code những phần mềm nào với Java mà phải xử lý các chuỗi? Tôi chắn rằng bạn biết trong Java có một số lớp liên quan đến chuỗi (xâu) và xử lý chuỗi (VD: String, StringBuilder, StringBuffer, StringTokenizer), có khi nào bạn đặt câu hỏi rằng đã có String sao lại phải có thêm StringBuider? Hay bạn mặc nhiên dùng String mà không thèm đoái hoài gì đến StringBuffer và StringBuilder?! Việc bạn không dùng StringBuilder có thể do bạn chưa hiểu được vì sao lại có lớp này trong Java. Vậy chúng ta cùng tìm hiểu về sự khác biệt giữa các lớp này nhé.
Nói chung, khác biệt đáng kể nhất giữa String và StringBufferStringBuilder trong Java đó là đối tượng String là không thể thay đổi (immutable – không thể thay đổi giá trị) trong khi đó các đối tượng StringBuffer, StringBuilder lại có thể thay đổi (mutable – có thể thay đổi giá trị). Tức là giá trị (chuỗi) được lưu trữ trong đối tượng String không thể thay đổi được. Nếu vậy chắc rằng bạn sẽ đặt tiếp câu hỏi “như thế thì làm thế nào để tôi thay đổi giá trị của đối tượng này?” hay “tôi vẫn thay được giá trị của nó đấy thôi?”. Thực ra, việc thay đổi giá trị của đối tượng String được thực hiện bằng cách tạo một đối tượng mới có giá trị mà bạn muốn đổi sang. Cụ thể như sau:
Bạn khai báo một chuỗi:
1
2
3
4
String myName = "Tạp chí Lập trình";
//Tiếp đến để thêm vào cuối chuỗi này bạn làm như sau:
myName = myName + " - 2012";
Khi đó, nếu xem nội dung của chuỗi myName chắc chắn bạn nhận được là “Tạp chí Lập trình – 2012”, tuy nhiên để làm được điều này JVM sẽ phải tạo một đối tượng mới có chứa nội dung là “Tạp chí Lập trình – 2012” rồi gán nó cho tham chiếu myName thay vì sửa nội dung của đối tượng ban đầu. Đến đây chắc là bạn sẽ nghĩ tới tình huống mà ta cần thực hiện các hành động như thêm nội dung, bớt nội dung, thay thế, v.v. với một đối tượng String sẽ dẫn đến phát sinh hàng loạt các đối tượng String mới trong bộ nhớ.
Vậy vấn đề của chúng ta ở đây đó là hiệu suất (performance)? Quá rõ ràng rồi, nếu chúng ta thao tác nhiều với chuỗi (thay đổi nội dung)  thông qua các đối tượng String thì HIỆU SUẤTchính là vấn đề mà bạn gặp phải. Tức là càng tạo ra nhiều đối tượng tạm thì bộ thu dọn rác (Garbage Collection) càng phải làm việc nhiều hơn để dọn dẹp lại bộ nhớ.
Trong trường hợp này StringBuilder hoặc StringBuffer sẽ giúp bạn giải quyết vấn đề về hiệu suất. Tại sao vậy?
Như đã khẳng định ở phần đầu, hai lớp trên đều thuộc lọai mutable, chúng ta có thể thay đổi được các giá trị của chúng, hay nói cách khác các chuỗi chứa trong StringBuffer, StringBuilder có thể thay đổi được giá trị. Nhờ đặc tính này mà khi thay đổi các chuỗi trong những đối tượng này JVM không phải tạo các đối tượng mới (đối tượng tạm) và vấn đề về performance như kể trên với String được giải quyết triệt để ở StringBuffer, StringBuilder. Chúng ta cùng xem thao tác thay đổi nội dung một chuỗi với StringBuilder:
Tạo mới một chuỗi:
1
2
3
4
StringBuilder myName = new StringBuilder("Tạp chí Lập trình");
//Bổ sung vào cuối một chuỗi
myName.append(" - 2012");
Vậy là bạn đã đổi được nội dung của một chuỗi với StringBuilder mà không lo sợ về performance.
Nếu bạn muốn có bằng chứng thuyết phục hơn về sự hiệu quả của StringBuilder so với String, xin mời đọc thêm bài viết này: Dùng Profiler đo hiệu năng ứng dụng Java.
Cuối cùng, bạn có muốn biết sự khác biệt giữa StringBuilder và StringBuffer không? Hai lớp này được thiết kế với mục đích giống nhau, đó là thao tác hiệu quả với chuỗi, chúng cũng có các phương thức giống nhau để làm việc với chuỗi. Điểm khác biệt đáng lưu ý: StringBuffer thuộc loại synchronized do đó các phương thức của nó đều là “thread safe” (thích hợp với xử lý đa luồng – multi thread), trong khi StringBuilder thì ngược lại, không synchronized. Với đặc tính “thread safe”, các phương thức của StringBuffer sẽ chạy chậm hơn so với StringBuilder, vì vậy nếu không làm về Multi-thread bạn nên chọn StringBuilder thay vì chọn StringBuffer.
Lưu ý: StringBuilder mới được giới thiệu từ Java 1.5, do đó nếu bạn đang phát triển trên Java 1.4 bạn sẽ không sử dụng được lớp này.
Nguyễn Việt Khoa.

Bài mới

Bài đăng nổi bật